#include<iostream>
#include<random>
#include<sstream>
#include<iomanip> // setw()
#include<atomic>

/*
    UUID通用唯一识别码
    这里用 
        1. 8个0~255之间的随机数
           +
        2. 8字节的序号
*/
int main()
{
    std::random_device rd;
    //size_t num = rd();//生成一个机器随机数（和硬件有关），效率较低
    //解决方案：通过一个机器真实随机数作为种子生成伪随机数
    std::mt19937_64 generator(rd());// “梅森旋转算法”
    std::uniform_int_distribution<int> distribution(0, 255);//限定区间范围
    //转换成16进制数字字符

    //8个2位十六进制    8-4-4
     std::stringstream ss;
     for (int i = 0; i < 8; i++) {
        ss << std::setw(2) << std::setfill('0') << std::hex << distribution(generator);
        if (i == 3 || i == 5 || i==7){
            ss << '-';
        }
     }

     //8字节序号 4-12
     static std::atomic<size_t> seq(1); //原子类型的size_t(正好8字节)，初始化为1，static使得每次都继续递增
     size_t num = seq.fetch_add(1); // tips:static仅保证在单个进程的生命周期内，同一进程内多次调用会递增，跨进程（每次运行程序是新进程）不行
     for (int i = 7; i >= 0; i--){
        ss << std::setw(2) << std::setfill('0') << std::hex << (num>>(i*8) & 0xff);//每次右移一字节、每次取最低一字节的数据
        if (i ==6 )
            ss << '-';
     }
    
    std::cout << ss.str() << std::endl;
    return 0;
}